package br.com.financas.bean;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import br.com.financas.abstractions.IContaService;
import br.com.financas.abstractions.IReceitaService;
import br.com.financas.abstractions.ITipoService;
import br.com.financas.entity.Conta;
import br.com.financas.entity.Receita;
import br.com.financas.entity.ReceitaData;
import br.com.financas.entity.Tipo;
import br.com.financas.entity.Usuario;
import br.com.financas.enumflags.EnumReferenciaFlag;
import br.com.financas.enumflags.EnumSituacaoFlag;
import br.com.financas.service.ContaService;
import br.com.financas.service.ReceitaService;
import br.com.financas.service.TipoService;

@ManagedBean
@ViewScoped
public class NovaReceitaBean extends AbstractBean {
	@ManagedProperty(value = UsuarioBean.INJECTION_NAME)
	private UsuarioBean usuarioBean;
	private Usuario usuario = new Usuario();
	private Receita receita = new Receita();
	private IReceitaService<Receita> receitaService = new ReceitaService();
	private IContaService<Conta> contaService = new ContaService();
	private ITipoService<Tipo> tipoService = new TipoService();
	private List<Conta> contaList = new ArrayList<Conta>();
	private List<Tipo> tipoList = new ArrayList<Tipo>();
	private Conta conta = new Conta();
	private ReceitaData receitaData = new ReceitaData();
	private boolean efetuada;
	private boolean repetir;
	private int prestacao = 0;
	private String btnId;


	public void commandClicked(ActionEvent event) {
		btnId = event.getComponent().getClientId();

	}
	
	public void setUsuarioBean(UsuarioBean usuarioBean) {
		this.usuarioBean = usuarioBean;
	}

	public Receita getReceita() {
		return receita;
	}

	public void setReceita(Receita receita) {
		this.receita = receita;
	}

	public boolean isEfetuada() {
		return efetuada;
	}

	public void setEfetuada(boolean efetuada) {
		this.efetuada = efetuada;
	}

	public boolean isRepetir() {
		return repetir;
	}

	public void setRepetir(boolean repetir) {
		this.repetir = repetir;
	}

	public ReceitaData getReceitaData() {
		return receitaData;
	}

	public void setReceitaData(ReceitaData receitaData) {
		this.receitaData = receitaData;
	}

	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public List<Conta> getContaList() {
		usuario = usuarioBean.getUsuario();
		contaList = contaService.obterPorUsuario(usuario);
		return contaList;
	}

	public List<Tipo> getTipoList() {
		tipoList = tipoService
				.validarObterPorReferencia(EnumReferenciaFlag.RECEITA);
		return tipoList;
	}

	public void setTipoList(List<Tipo> tipoList) {
		this.tipoList = tipoList;
	}
	
	

	public int getPrestacao() {
		return prestacao;
	}

	public void setPrestacao(int prestacao) {
		this.prestacao = prestacao;
	}

	
	public String cadastrar() throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
		
		Date data = new Date(System.currentTimeMillis());
		String dataStr = formatter.format(data);
		Date dataAtual = formatter.parse(dataStr);
		String msgErro = null;
		String nextPage = "/listar-receitas.xhtml";
		EnumSituacaoFlag situacao = efetuada == true ? EnumSituacaoFlag.EFETIVADA : EnumSituacaoFlag.PENDENTE;
		situacao = efetuada == false && receitaData.getData().before(dataAtual) ? EnumSituacaoFlag.ATRASADA : situacao;
		
		receitaData.setSituacao(situacao);
		receitaData.setReceita(receita);
		
		try {
			msgErro = receitaService.validarReceitaInserir(receita, prestacao, receitaData);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(msgErro == null){
			displayInfoMessageToUser("receita.sucesso");
		}else{
			displayWarnMessageToUser(msgErro);
			nextPage =  null;
		}
		
		nextPage = btnId.equals("formReceita:bntSalvarContinuar") ? "/nova-receita.xhtml;" : nextPage;

		return nextPage;
	}

}
